#include "list.h"
#include "stdlib.h"
#include "stdio.h"

List* createList() {
	
	List* list = malloc(sizeof(List));
	
	list->first = NULL;
	list->size = 0;
	
	return list;
}

ListNode* createNode(ListNode* next, NUMTYPE value) {
	ListNode* listNode = malloc(sizeof(ListNode));
	listNode->next = next;
	listNode->value = value;
	
	return listNode;
}

// insercion al principio de la lista
void prependToList(List* list, NUMTYPE value) {
	list->first = createNode(list->first, value);
	list->size++;
}

// insercion ordenada en la lista
void insertToList(List* list, NUMTYPE value) {
	// recorrer la lista hasta encontrar el lugar del nuevo elemento
	
	if (list->first == NULL ) {
		prependToList(list, value);
	} else {
		
		ListNode* lastNode = NULL;
		ListNode*  node;
		
		for (node = list->first; node != NULL; node = node->next) {
			ListNode* newNode;
			
			if (value < node->value ) {
				// insertar posteriormente al nodo anterior, y antes del actual
				newNode = createNode( node, value);
				
				if (lastNode == NULL) {
					list->first = newNode;
				} else {
					lastNode->next = newNode;
				}
				
				list->size++;
				return;
			}
			
			lastNode = node;
		}
		
		if (lastNode) {
			lastNode->next = createNode( 0, value);
		} else {
			list->first = createNode( 0, value);
		}
		list->size++;
	}
}

void printList(List* list) {
	ListNode*  node;
		
	for (node = list->first; node != NULL; node = node->next) {
		printf("%f\n", node->value);
	}
}

// busqueda de nodo de la lista por indice, devuelve NULL si no existe
ListNode* seekNode(List* list, int index) {
	
	int i;
	ListNode* node = list->first;
	for (i=0; i<index;i++) {
		node = node->next;
		if (!node) {
			return NULL;
		}
	}
	
	return node;
}

// cantidad de nodos, elementos de la lista
int nodeCount(List* list) {
	return list->size;
}

// elimina la lista y todos sus nodos
void destroyList(List* list) {
	
	ListNode* node;
	for (node = list->first; node != NULL; node = node->next) {
		free(node);
	}
	free(list);
}
